#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void sig_int(int signo)
{
	printf("\nreceived SIGINT!\n");
}

int main()
{
	sigset_t newmask, oldmask;
	if (signal(SIGINT, sig_int) == SIG_ERR)
		perror("signal(SIGINT) error!");

	sigemptyset(&newmask);
	sigaddset(&newmask, SIGINT);

	/*
	 SIG_BLOCK 表示+，在原来的基础上把集合里的信号加进去
	 SIG_UNBLOCK 表示-，在原来的里面去掉集合里的信号
	 SIG_SETMASK 表示=，用集合里的信号覆盖原来的
	 */
	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) /* 屏蔽newmask,将当前的保存到oldmask */
		perror("sigprocmask(SIG_BLOCK) error!");

	printf("press Ctrl+C to test\n");
	printf("block SIGINT 5 seconds\n");

	/* 休眠期间任何SIGINT信号都会被阻塞，期间收到任何键盘的Ctrl+C信号会保存在内核的队列中，等待休眠结束后恢复成原来的，可能要处理此信号 */
	sleep(5);
#if 0
	printf("unblock SIGINT\n");
	if (sigprocmask(SIG_UNBLOCK, &newmask, NULL) < 0)
		perror("sigprocmask(SIG_UNBLOCK) error!");
#else
	printf("set old mask to handle SIGINT\n");
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) /*恢复成oldmask */
		perror("sigprocmask(SIG_SETMASK) error!");
#endif

	printf("waiting to end\n");
	sleep(5);

	return 0;
}
